package co.edu.javeriana.konigsberg.xavier.servicio;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import co.edu.javeriana.konigsberg.xavier.dao.desc.CiudadDAOLocal;
import co.edu.javeriana.konigsberg.xavier.dto.CiudadDTO;
import co.edu.javeriana.konigsberg.xavier.dto.DepartamentoDTO;
import co.edu.javeriana.konigsberg.xavier.entidad.Ciudad;

/**
 * Session Bean implementation class CiudadServicio
 */
@Stateless
public class CiudadServicio implements CiudadServicioRemote, CiudadServicioLocal {
	
	@EJB
	private CiudadDAOLocal ciudadDAO;
	
//	@EJB
//	private DepartamentoDAOLocal departamentoDAO;
//	
//	@EJB
//	private PaisDAOLocal paisDAO;
//	
//	@EJB
//	private DepartamentoServicio departamentoServicio;
//	
//	@EJB
//	private PaisServicio paisServicio;
	
	private static Map<BigInteger, List<CiudadDTO>> mapaCiudadesPorDepartamento;
	private static Map<BigInteger, CiudadDTO> mapaCiudades;
	
    /**
     * Default constructor. 
     */
    public CiudadServicio() {
        // TODO Auto-generated constructor stub
    }

    @Override
	public List<CiudadDTO> obtenerLista() {
		List<Ciudad> ciudades = ciudadDAO.obtenerLista();
		List<CiudadDTO> ciudadDTOs = new ArrayList<CiudadDTO>();
		for (Ciudad ciudad : ciudades) {
			CiudadDTO ciudadDTO = new CiudadDTO();
			ciudadDTO.setIdCiudad(ciudad.getIdCiudad());
			ciudadDTO.setNombreCiudad(ciudad.getNombreCiudad());
			ciudadDTOs.add(ciudadDTO);
		}
		return ciudadDTOs;
	}

	@Override
	public List<CiudadDTO> obtenerListaDePadre(DepartamentoDTO departamentoDTO) {
		if(mapaCiudadesPorDepartamento == null){
			mapaCiudadesPorDepartamento = new HashMap<BigInteger, List<CiudadDTO>>();
		}
		if(mapaCiudadesPorDepartamento.containsKey(departamentoDTO.getIdDepartamento())){
			return mapaCiudadesPorDepartamento.get(departamentoDTO.getIdDepartamento());
		}else{
			if(mapaCiudades == null){
				mapaCiudades = new HashMap<BigInteger, CiudadDTO>();
			}
			List<Ciudad> ciudades = ciudadDAO.obtenerListaPorPadre(departamentoDTO.getIdDepartamento());
			List<CiudadDTO> ciudadDTOs = new ArrayList<CiudadDTO>();
			for (Ciudad ciudad : ciudades) {
				CiudadDTO ciudadDTO = getDTO(ciudad, departamentoDTO);
				ciudadDTOs.add(ciudadDTO);
				mapaCiudades.put(ciudadDTO.getIdCiudad(), ciudadDTO);
			}
			mapaCiudadesPorDepartamento.put(departamentoDTO.getIdDepartamento(), ciudadDTOs);
			return ciudadDTOs;
		}
	}

	@Override
	public CiudadDTO obtenerCiudadPorId(BigInteger id) {
//		if(mapaCiudades == null){
//			List<Ciudad> ciudades = ciudadDAO.obtenerLista();
//			for (Ciudad ciudad : ciudades) {
//				if(ciudad.getIdCiudad().equals(id)){
//					return getDTO(ciudad, null);
//				}
//			}
//		}
		return mapaCiudades == null ? getDTO(ciudadDAO.obtenerPorId(id), null) : mapaCiudades.get(id);
//		Ciudad ciudad = ciudadDAO.obtenerPorId(id);
//		Departamento depar = departamentoDAO.obtenerPorId(ciudad.getDepartamento().getIdDepartamento());
//		Pais pais = paisDAO.obtenerPorId(depar.getPais().getIdPais());
//		return getDTO(ciudad, departamentoServicio.getDTO(depar, paisServicio.getDTO(pais)));
	}

	@Override
	public CiudadDTO getDTO(Object entidad, DepartamentoDTO departamentoDTO) {
		Ciudad ciudad = (Ciudad)entidad;
		CiudadDTO ciudadDTO = new CiudadDTO();
		ciudadDTO.setIdCiudad(ciudad.getIdCiudad());
		ciudadDTO.setNombreCiudad(ciudad.getNombreCiudad());
		ciudadDTO.setDepartamentoDTO(departamentoDTO);
		return ciudadDTO;
	}
}
